package com.yudean.esb.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 处理字符串的工具类。
 * <br/>
 * 在向此类添加功能时，优先使用common-lang中的StringUtils
 *
 * @author yushujiang
 */
public class StringHelper {

    /**
     * 根据表达式忽略大小写查找是否包含
     *
     * @param text
     * @param regExp
     * @return
     */
    public static boolean containsIgnoreCase(String text, String regExp) {
        Pattern pattern = Pattern.compile(regExp, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(text);
        return matcher.find();
    }

    /**
     * 忽略大小替换
     *
     * @param text
     * @param regExp
     * @param replacedAs
     * @return
     */
    public static String replaceIgnoreCase(String text, String regExp, String replacedAs) {
        Pattern pattern = Pattern.compile(regExp, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(text);
        return matcher.replaceAll(replacedAs);
    }

    /**
     * 首字母变小写
     */
    public static String firstCharToLowerCase(String str) {
        Character firstChar = str.charAt(0);
        String tail = str.substring(1);
        str = Character.toLowerCase(firstChar) + tail;
        return str;
    }

    /**
     * 首字母变大写
     */
    public static String firstCharToUpperCase(String str) {
        Character firstChar = str.charAt(0);
        String tail = str.substring(1);
        str = Character.toUpperCase(firstChar) + tail;
        return str;
    }

    /**
     * 字符串为 null 或者为  "" 时返回 true
     */
    public static boolean isBlank(String str) {
        return str == null || "".equals(str.trim());
    }

    /**
     * 字符串不为 null 而且不为  "" 时返回 true
     */
    public static boolean notBlank(String str) {
        return !(str == null || "".equals(str.trim()));
    }

    public static boolean notBlank(String... strings) {
        if (strings == null)
            return false;
        for (String str : strings)
            if (str == null || "".equals(str.trim()))
                return false;
        return true;
    }

    public static boolean notNull(Object... paras) {
        if (paras == null)
            return false;
        for (Object obj : paras)
            if (obj == null)
                return false;
        return true;
    }

    /**
     * 获得文件的后缀名
     *
     * @param s
     * @param split
     * @return
     */
    public static String getExtName(String s, char split) {
        int i = s.indexOf(split);
        int length = s.length();
        return (i > 0 ? (i + 1) == length ? null : s.substring(i, s.length()) : null);
    }

    /**
     * 判断是否是数字
     *
     * @param str
     * @return
     */
    public static boolean isInt(String str) {
        if (str == null || "".equals(str.trim())) return false;
        try {
            Integer.parseInt(str);
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 计算时间表达式
     *
     * @param second        秒
     * @param minute        分
     * @param hour          时
     * @param day           日期
     * @param month         月份
     * @param week          星期
     * @param year          年份
     * @param isContactYear 是否包括年份
     * @return
     */
    public static String getCronExpression(String second, String minute, String hour,
                                           String day, String month, String week, String year, boolean isContactYear) {
        String cexpress = "";
        //秒，默认为"0" 取值范围：0-59
        if (StringHelper.isInt(second)) {
            cexpress += Integer.parseInt(second) + " ";
        } else {
            cexpress += "0 ";
        }

        /**
         * 分 取值范围：0-59
         * 默认为"*"      表示每一分钟
         * 如果是0 12     表示整12:00触发
         * 如果是0/5 12   表示在每天下午12点到12:55期间的每5分钟触发 ，
         * 如果是0-5 12   表示12:00到12:05期间的每1分钟触发
         * 如果是10,15 12 表示12:10和12:15触发
         */
        if (StringHelper.isInt(minute)) {
            cexpress += minute + " ";
        } else {
            cexpress += "* ";
        }

        /**
         * 小时 取值范围：0-23
         * 默认为"*"      表示每一个小时
         * 如果是0        表示凌晨触发
         * 如果是0-5        表示凌晨到5:00期间
         * 如果是10,15    表示10:00和15:00触发
         */
        if (StringHelper.isInt(hour)) {
            cexpress += hour + " ";
        } else {
            cexpress += "* ";
        }

        /**
         * 日期 取值范围：1-31
         * 默认为"*" 表示每天
         * 如果是15  表示每个月的15号
         * 如果是L   表示每个月最后一天
         * 注：在指定了星期的时候，把日期这里设置为"?"
         */
        if (StringHelper.isInt(day)) {
            cexpress += day + " ";
        } else {
            cexpress += "* ";
        }

        /**
         * 月份 取值范围：1-12
         * 默认为"*"  表示每个月
         * 如果是 12  表示12月份
         */
        if (StringHelper.isInt(month)) {
            cexpress += month + " ";
        } else {
            cexpress += "* ";
        }

        /**
         * 星期  取值范围：1-7 MON,TUE,WED,THU,FRI,SAT,SUN  其中1表示星期日，以此类推
         * 默认为"?"
         * 如果是WED      表示每个星期三
         * 如果是MON-FRI  表示星期一到星期五
         * 如果是6L       表示每月最后一个星期五
         * 如果是6#3      表示每月第三个星期五
         */
        if (StringHelper.isInt(week)) {
            cexpress += week + " ";
        } else {
            cexpress += "? ";
        }

        //如果包括年份
        if (isContactYear) {
            /**
             * 年份  取值范围：1970-2099
             * 默认值为空
             * 如果是2010 表示只有2010年触发时间
             * 如果是2010,2020 表示只有2010
             */
            if (StringHelper.isInt(year)) {
                cexpress += year;
            }
        }

        return cexpress;
    }

    /**
     * 计算时间表达式
     *
     * @param second        秒
     * @param minute        分
     * @param hour          时
     * @param day           日期
     * @param month         月份
     * @param week          星期
     * @param year          年份
     * @param isContactYear 是否包括年份
     * @return
     */
    public static String generateCronExpression(String second, String minute, String hour,
                                                String day, String month, String year, String cycleType, String cycleNum) {
        StringBuffer cexpress = new StringBuffer();
        //秒，默认为"0" 取值范围：0-59
        if (StringHelper.isInt(second)) {
            cexpress.append(Integer.parseInt(second) + " ");
        } else {
            cexpress.append("0 ");
        }

        /**
         * 分 取值范围：0-59
         * 默认为"*"      表示每一分钟
         * 如果是0 12     表示整12:00触发
         * 如果是0/5 12   表示在每天下午12点到12:55期间的每5分钟触发 ，
         * 如果是0-5 12   表示12:00到12:05期间的每1分钟触发
         * 如果是10,15 12 表示12:10和12:15触发
         */
        if (StringHelper.isInt(minute)) {
            cexpress.append(minute + " ");
        } else {
            cexpress.append("* ");
        }
        if (cycleType.equals("minute")) {
            cexpress.deleteCharAt(cexpress.length() - 1);
            cexpress.append("/" + cycleNum + " ");
        }

        /**
         * 小时 取值范围：0-23
         * 默认为"*"      表示每一个小时
         * 如果是0        表示凌晨触发
         * 如果是0-5        表示凌晨到5:00期间
         * 如果是10,15    表示10:00和15:00触发
         */
        if (StringHelper.isInt(hour)) {
            cexpress.append(hour + " ");
        } else {
            cexpress.append("* ");
        }
        if (cycleType.equals("hour")) {
            cexpress.deleteCharAt(cexpress.length() - 1);
            cexpress.append("/" + cycleNum + " ");
        }

        /**
         * 日期 取值范围：1-31
         * 默认为"*" 表示每天
         * 如果是15  表示每个月的15号
         * 如果是L   表示每个月最后一天
         * 注：在指定了星期的时候，把日期这里设置为"?"
         */
        if (StringHelper.isInt(day)) {
            cexpress.append(day + " ");
        } else {
            cexpress.append("* ");
        }
        if (cycleType.equals("day")) {
            cexpress.append("/" + cycleNum + " ");
        }

        /**
         * 月份 取值范围：1-12
         * 默认为"*"  表示每个月
         * 如果是 12  表示12月份
         */
        if (StringHelper.isInt(month)) {
            cexpress.append(month + " ");
        } else {
            cexpress.append("* ");
        }

        if (StringHelper.isInt(year)) {
            cexpress.append(year + " ");
        } else {
            cexpress.append("? ");
        }

        return cexpress.toString();
    }
}
